/*
 * Copyright (C) 2025 Huawei Device Co., Ltd.
 * Licensed under the Apache License, Version 2.0 (the 'License');
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an 'AS IS' BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
#ifndef LOTTIE_C_H
#define LOTTIE_C_H

#include <js_native_api_types.h>

#define EXPORT __attribute__((visibility("default")))
#ifdef __cplusplus
extern "C" {
#endif
typedef struct {
    float initFrame;
    float endFrame;
} CAnimationSegment;

typedef struct {
    int *startColor;
    size_t startColorNumber;
    int *endColor;
    size_t endColorNumber;
} CColorSegment;

typedef struct {
    bool loop;
    int loopCount;
    bool autoplay;
    char path[256];
    char *animationData;
    char lottleId[256];
    CAnimationSegment initialSegment;
    char contentMode[10];
    double frameRate;
    bool useCache;
    double radius;
    double bgColor;
    bool useImageCache;
} CLottieConfig;


typedef void (*CLottieListenerFunction)(void *);

/**
 * lottie组件环境初始化
 */
EXPORT int InitLottieComponentEnvironment(napi_env env);

/**
 * lottie配置初始化
 */
EXPORT CLottieConfig *CreateCLottieConfig();

/**
 * lottie配置销毁
 */
EXPORT void DestroyCLottieConfig(CLottieConfig *config);

/**
 * 创建lottie上下文
 */
EXPORT void *LottieCreateContext(napi_value contentView, CLottieConfig *config);

/**
 * 销毁lottie上下文
 */
EXPORT int LottieDestroyContext(void *context);

/**
 * 创建lottie动画
 */
EXPORT int LottieCreate(void *context);

/**
 * 设置监听函数
 * @param 事件名称 'enterFrame' | 'loopComplete' | 'complete' | 'segmentStart' | 'destroy' | 'config_ready' |
 * 'data_ready' | 'DOMLoaded' | 'error' | 'data_failed' | 'loaded_images'
 */
EXPORT int LottieAddListeningFunctionByName(void *context, char *funcName,
                                            CLottieListenerFunction listener, void *data);

/**
 * 设置监听函数
 * @param 事件名称 'enterFrame' | 'loopComplete' | 'complete' | 'segmentStart' | 'destroy' | 'config_ready' |
 * 'data_ready' | 'DOMLoaded' | 'error' | 'data_failed' | 'loaded_images'
 */
EXPORT int LottieRemoveListeningFunctionByName(void *context, char *funcName);

/**
 * 设置监听函数
 * @param 事件名称 'enterFrame' | 'loopComplete' | 'complete' | 'segmentStart' | 'destroy' | 'config_ready' |
 * 'data_ready' | 'DOMLoaded' | 'error' | 'data_failed' | 'loaded_images'
 */
EXPORT int LottieRemoveAllListeningFunctionByName(void *context);

/**
 * 动画播放
 */
EXPORT int LottiePlay(void *context);

/**
 * 动画暂停
 */
EXPORT int LottiePause(void *context);

/**
 * 动画停止
 */
EXPORT int LottieStop(void *context);

/**
 * 动画暂停播放切换
 */
EXPORT int LottieTogglePause(void *context);

/**
 * 动画销毁
 */
EXPORT int LottieDestroy(void *context);

/**
 * 控制动画画面停止在某一帧或某个时刻
 * @param value 帧号(值>=0)或时刻(ms)
 * @param isFrame true按帧控制, false按时间控制, 缺省默认false
 */
EXPORT int LottieGoToAndStop(void *context, float value, bool isFrame);

/**
 * 控制动画画面从在某一帧或某个时刻开始播放
 * @param value 帧号(>=0)或时刻(ms)
 * @param isFrame true按帧控制, false按时间控制, 缺省默认false
 */
EXPORT int LottieGoToAndPlay(void *context, float value, bool isFrame);

/**
 * 限定动画资源播放时的整体帧范围
 * @param init 起始帧号
 * @param end 结束帧号
 */
EXPORT int LottieSetSegment(void *context, float init, float end);

/**
 * 设置仅播放指定范围的帧动画
 * @param segments 片段或片段数组; 若传入的是数组, 且当前loop!=0, 播放结束后, 仅循环播放最后一个片段
 * @param number 片段个数
 * @param forceFlag 值为true立刻生效, 值为false循环下次播放的时候生效
 */
EXPORT int LottiePlaySegments(void *context, CAnimationSegment *segments, size_t number, bool forceFlag);

/**
 * 重置动画播放片段, 使动画重新从第一帧开始播放完整动画
 * @param forceFlag 值为true立刻生效, 值为false循环下次播放的时候生效
 */
EXPORT int LottieResetSegments(void *context, bool forceFlag);

/**
 * 设置播放速度
 * @param speed 值为浮点类型, speed>0正向播放, speed<0反向播放, speed=0暂停播放, speed=1.0/-1.0正常速度播放
 */
EXPORT int LottieSetSpeed(void *context, double speed);

/**
 * 设置播放方向
 * @param direction 1为正向, -1为反向
 */
EXPORT int LottieSetDirection(void *context, int direction);

/**
 * 设置尽可能的更新动画帧率
 * @param useSubFrames true为使用子帧, false为不使用子帧
 */
EXPORT int LottieSetSubframe(void *context, bool useSubFrames);

/**
 * 获取动画播放时间
 * @param inFrames 为true时获取帧数，值为false时获取时间(单位ms)，默认为false
 */
EXPORT double LottieGetDuration(void *context, bool inFrames);

/**
 * 改变动画某个图层的颜色，当前支持st和fl图层
 * @param layer 图层名称
 * @param colorSegment.startColor 起始颜色，若endColor不传，则startColor为要修改的颜色，支持RGB和RGBA格式
 * @param colorSegment.startColorNumber startColor数组的长度
 * @param colorSegment.endColor 结束颜色，支持RGB和RGBA格式
 * @param colorSegment.endColorNumber endColor数组的长度
 */
EXPORT int LottieChangeColor(void *context, char *layger, CColorSegment *colorSegment);

/**
 * 设置布局模式
 * @param contentMode 布局模式，Fill,Cover,Top,Bottom,Contain，默认为 Contain
 */
EXPORT int LottieSetContentMode(void *context, char *contentMode);

/**
 * 设置动画帧率
 * @param frameRate 动画帧率，范围1~120
 */
EXPORT int LottieSetFrameRate(void *context, int frameRate);

/**
 * 设置动画重载
 * @param reContext 动画配置
 */
EXPORT int LottieReload(void *context, void *reContext);

/**
 * 获取动画的ID，id内存自动管理，如果自己保存，需要自己拷贝一份
 */
EXPORT const char *LottieGetId(void *context);

#ifdef __cplusplus
}
#endif
#endif